package com.cicoding.utils;

import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.graphics.PdfBlendMode;
import com.spire.pdf.graphics.PdfTemplate;
import freemarker.template.Configuration;
import freemarker.template.Template;
import groovy.util.logging.Slf4j;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;

import java.awt.geom.Point2D;
import java.io.*;
import java.nio.file.Files;
import java.util.Map;

@Slf4j
public class DocUtils {
    private static final Logger log = LoggerFactory.getLogger(DocUtils.class);


    public static File testCreateWord(Map<String, String> params) throws IOException {
        //指定模板存放位置
        String templateFile = "fortest.xml";
        //指定模板存放位置
        ClassPathResource tempFileResource = new ClassPathResource("doc/" + templateFile);
        InputStream inputStream = tempFileResource.getInputStream();
        File temporaryFile = File.createTempFile(templateFile, ".xml");
        FileUtil.inputStream2File(inputStream, temporaryFile);
        return createWord(temporaryFile, params);
    }

    /**
     * 转换doc文档为xml
     * @param docFile
     * @return
     */
    public static File coverDocToXml(File docFile) {
        //加载Word测试文档
        Document doc = new Document();
        doc.loadFromFile(docFile.getAbsolutePath());//支持doc格式

        //调用方法转为xml文件
        doc.saveToFile(docFile.getName() + ".xml", FileFormat.Word_Xml);
        doc.dispose();
        return new File(docFile.getName() + ".xml");
    }



    /**
     * 转换doc文档为pdf
     * @param docFile
     * @return
     */
    public static File coverDocToPdf(File docFile) {
        //加载Word测试文档
        Document doc = new Document();
        doc.loadFromFile(docFile.getAbsolutePath());//支持doc格式

        //调用方法转为xml文件
        doc.saveToFile(docFile.getName() + ".pdf", FileFormat.PDF);
        doc.dispose();
        return new File(docFile.getName() + ".pdf");
    }

    public static File createWord(File wordTemplateFile, Map<String, String> params) throws IOException {
        String templateFile = wordTemplateFile.getName();
        //指定模板
        InputStream inputStream = null;

        // 模板文件
        File temporaryFile = null;

        // 文件输出
        Writer out = null;
        File outputFile = null;
        FileOutputStream outputStream = null;

        try {
            /**
             * 读取模板
             */
            //指定模板存放位置
//            ClassPathResource tempFileResource = new ClassPathResource("doc/" + templateFile);
            //创建模板临时文件
            temporaryFile = File.createTempFile(templateFile, ".xml");
            outputStream = new FileOutputStream(temporaryFile);
            inputStream = FileUtil.file2InputStream(wordTemplateFile);
            IOUtils.copy(inputStream, outputStream);
            log.info("创建临时文件的路径为:{}", temporaryFile.getAbsolutePath());

            /**
             * 写入模板
             */
            // 设置FreeMarker的版本和编码格式
            Configuration configuration = new Configuration();
            configuration.setDefaultEncoding("UTF-8");
            // 设置FreeMarker生成Word文档所需要的模板的路径
            configuration.setDirectoryForTemplateLoading(temporaryFile.getParentFile());
            // 设置FreeMarker生成Word文档所需要的模板
            Template template = configuration.getTemplate(temporaryFile.getName(), "UTF-8");

            /**
             * 输出文件
             */
            //创建临时文件
            outputFile = File.createTempFile(templateFile, ".docx");
            //得到临时文件全路径  ,作为word生成的输出全路径使用
            String outputDir = outputFile.getAbsolutePath();
            log.info("创建临时文件的路径为:{}", outputDir);
            // 创建一个Word文档的输出流
            out = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(new File(outputDir).toPath()), "UTF-8"));
            //FreeMarker使用Word模板和数据生成Word文档
            template.process(params, out); //将填充数据填入模板文件并输出到目标文件
        } catch (Exception e) {
            log.error("word生成报错,错误信息{}", e.getMessage());
            e.printStackTrace();
        } finally {
            if (out != null) {
                out.flush();
                out.close();
            }
            if (inputStream != null) {
                inputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
            if (temporaryFile != null) {
                temporaryFile.delete();
            }
        }
        return outputFile;
    }

}
